package com.xxx.exception;

/**
 * @version v1.0
 * @Description:
 * @Author zhanzhongxin
 * @Date 2021/7/16 14:08
 * @Copyright 博为峰
 */

/*
   try{
      需要被检测异常的代码
   }catch(异常类 变量名){
      处理异常的代码
   }catch(异常类 变量名){
      处理异常的代码
   }
   ...
   }finally{
      一定会被执行的
   }
 */

  /*
     处理异常的方式：
     1.抛出
     2.try...catch
   */

    /*
       java异常处理的优点：
       1.把各种不同类型的异常情况进行分类，然后用java描述描述，可以充分发挥类的可扩展性和重用性
       2.异常流程的代码和正常流程的代码分离，提高了程序的可读性，程序结构清晰
       3.对于异常，如果方法有能力处理就捕获处理，否则抛出由调用者处理
     */

    /*
       异常处理原则:
       1.异常处理只能用于非正常情况，不能用于来控制代码的正常流程
         >>滥用异常会降低程序的性能
         >>容易掩盖程序代码的粗我，增加调试的复杂性
       2.为异常提供说明文档
       3.尽量避免异常
       4.避免过于庞大的try代码块
       5.在catch中尽量知道具体的异常类型
     */
public class ExceptionDemo03 {
    public static void main(String[] args) throws FxException {
        int[] arr = new int[3];
        arr = null;
        try {
            method(arr, 10);
        } catch (NullPointerException e) {//NullPointerException e = new NullPointerException("不能为空");
//            System.out.println(e.getMessage());
//            System.out.println("空指针异常已处理");
//            e.printStackTrace();
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("下标越界异常已处理");
        } catch (FxException e) {
            throw new FxException("不能为负数");
        } catch (Exception e) {

        } finally {
//            System.exit(1);//终止虚拟机
            System.out.println("一定会被执行");
        }
        System.out.println("abc");
    }

    public static void method(int[] arr, int index) throws FxException {
        if (arr == null) {
            throw new NullPointerException("不能为空");
        }

        if (index > arr.length) {
            throw new ArrayIndexOutOfBoundsException("不能越界");
        }

        if (index < 0) {
            throw new FxException("不能是负数");
        }
        System.out.println(arr[index]);
    }
}
